package class17;

import java.util.Stack;

/**
 * @author YZY
 * @since 2022/8/17 15:32
 * 给定一个栈，请逆序这个栈，不能申请额外的数据结构，只能使用递归函数
 */
public class Code05_ReverseStackUsingRecursive {

    /**
     * 思路：
     * 首先抽象出一个黑盒，黑盒功能是拿出栈底的元素，并把其他元素放回
     * 回到主函数，使用一个变量记录下栈底元素，直到拿到栈为空开始依次push拿到的栈底元素
     *
     * @param stack 栈
     */
    public static void reverse(Stack<Character> stack) {
        if (stack.isEmpty()) {
            return;
        }
        Character data = process(stack);
        reverse(stack);
        stack.push(data);
    }

    private static Character process(Stack<Character> stack) {
        Character result = stack.pop();
        if (stack.isEmpty()) {
            return result;
        }
        Character last = process(stack);
        stack.push(result);
        return last;
    }

    public static void main(String[] args) {
        Stack<Character> stack = new Stack<>();
        stack.push('A');
        stack.push('B');
        stack.push('C');
        System.out.println(stack);
        reverse(stack);
        System.out.println(stack);
    }

}
